﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataAccess;
using System.Linq.Expressions;
using QuanLyKhachSan.Validation;
using QuanLyKhachSan;
using System.Data.Entity;

namespace BLL
{
    public class LoaiPhongManager: IValidator<LoaiPhong> , ILenhThucThi<LoaiPhong>
    {
        public ValidateResult Validate(LoaiPhong obj)
        {
            var vResult = new ValidateResult();
            if (string.IsNullOrEmpty(obj.MaLoaiPhong.Trim()))
            {
                vResult.Message.Add("Chưa nhập mã loại phòng!");
            }
            if (string.IsNullOrEmpty(obj.TenLoaiPhong.Trim()))
            {
                vResult.Message.Add("Chưa nhập tên loại phòng!");
            }
            if (obj.GiaPhong <= 0)
            {
                vResult.Message.Add("Giá phòng phải lớn hơn 0!");
            }
            return vResult;
        }

        public ActionResult Them(LoaiPhong obj)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                var query = from p in context.LoaiPhongs
                            where p.MaLoaiPhong == obj.MaLoaiPhong
                            select p;
                try
                {
                    if (query.Any())
                    {
                        aResult.Exceptions.Add(new Exception("Đã tồn tại phòng có số phòng là: " + obj.MaLoaiPhong));
                    }
                    else
                    {
                        context.LoaiPhongs.Add(obj);
                        context.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
                return aResult;
            }
        }

        public ActionResult CapNhat(LoaiPhong obj)
        {
            var actionResult = new ActionResult();
            using (var context = new QLKhachSanContext())
            {
                var lpUpdate = context.LoaiPhongs.Single(lp => lp.MaLoaiPhong.Equals(obj.MaLoaiPhong));
                try
                {
                    lpUpdate.MaLoaiPhong = obj.MaLoaiPhong;
                    lpUpdate.TenLoaiPhong = obj.TenLoaiPhong;
                    lpUpdate.GiaPhong = obj.GiaPhong;
                    lpUpdate.TrangThai = obj.TrangThai;

                    context.Entry(lpUpdate).State = EntityState.Modified;
                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    actionResult.Exceptions.Add(ex);
                }
            }
            return actionResult;
        }

        public ActionResultAsList<LoaiPhong> LayDanhSach()
        {
            var actionResult = new ActionResultAsList<LoaiPhong>();
            var context = new QLKhachSanContext();
            actionResult.Result = context.LoaiPhongs.Where(lp => lp.TrangThai != null && System.String.Compare(lp.TrangThai, "Da xoa", System.StringComparison.InvariantCultureIgnoreCase) != 0 && System.String.Compare(lp.TrangThai, "Đã xóa", System.StringComparison.InvariantCultureIgnoreCase) != 0).ToList();
            return actionResult;
        }

        public ActionResult Xoa(string ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                try
                {
                    var query = (from lp in context.LoaiPhongs
                                 where lp.MaLoaiPhong == ma
                                 select lp).FirstOrDefault();
                    foreach (var va in KiemTraRangBuoc(ma).Exceptions)
                    {
                        aResult.Exceptions.Add(va);
                    }
                    if (KiemTraRangBuoc(ma).Exceptions != null)
                    {
                        context.LoaiPhongs.Remove(query);
                        context.SaveChanges();
                    }
                    else
                    {
                        query.TrangThai = "Đã xoá";
                        context.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }   
            }
            return aResult;
        }

        public ActionResult Xoa(LoaiPhong obj)
        {
            ActionResult actionResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                var query = from lp in context.Phongs.Where(d => d.MaLoaiPhong.Equals(obj.MaLoaiPhong)) select lp;
                var query2 = from lp in context.ThietBiPhongs.Where(d => d.MaLoaiPhong.Equals(obj.MaLoaiPhong)) select lp;

                if ((query.Any() == true) || (query2.Any()== true))
                {
                    actionResult.Exceptions.Add(new Exception("Có ràng buộc về khóa ngoại, đã đưa về trạng thái Đã xóa!"));
                    context.LoaiPhongs.Single(mlp => mlp.MaLoaiPhong.Equals(obj.MaLoaiPhong)).TrangThai = "Đã xóa";
                    context.SaveChanges();
                }
                else
                {
                    var lp = context.LoaiPhongs.Single(d => d.MaLoaiPhong.Equals(obj.MaLoaiPhong));
                    context.LoaiPhongs.Remove(lp);
                    context.SaveChanges();
                }
            }
            return actionResult;
        }

        private ActionResult KiemTraRangBuoc(string ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                var query1 = from p in context.Phongs
                             where p.MaLoaiPhong == ma
                             select p;
                var query2 = from tbp in context.ThietBiPhongs
                             where tbp.MaLoaiPhong == ma
                             select tbp;
                if (query1.Any())
                {
                    aResult.Exceptions.Add(new Exception("Vi phạm ràng buộc trên bảng Phong"));
                }
                if (query2.Any())
                {
                    aResult.Exceptions.Add(new Exception("Vi phạm ràng buộc trên bảng ThietBiPhong"));
                }
            }
            return aResult;
        }
    }
}
